package com.zego.manager;

import android.content.Context;

import com.zego.base.http.HttpMgr;
import com.zego.base.http.HttpMgrImpl;
import com.zego.base.http.request.RequestHelper;
import com.zego.base.log.PLogger;
import com.zego.base.log.PSP;
import com.zego.base.log.PToast;
import com.zego.base.observer.ModuleBase;

import java.util.ArrayList;
import java.util.List;

/**
 * 模块初始化工具
 */
public final class ModuleMgr {

    private static List<ModuleBase> selfModules = new ArrayList<>();
    /**
     * 网络请求模块
     */
    private static HttpMgr httpMgr = null;
    /**
     * 网络请求模块
     */
    private static CommonMgr commonMgr = null;

    /**
     * 调用所有逻辑模块
     */
    public static void releaseAll() {
        for (ModuleBase item : selfModules) {
            try {
                item.release();
            } catch (Throwable e) {
                PLogger.printThrowable(e);
            }
        }
        selfModules.clear();
        selfModules = null;
    }

    /**
     * 按等级初始化逻辑模块
     */
    public static void initModule(final Context context) {
        PSP.getInstance().init(context);//初始化sharedPreferences存储，每个进程都初始化一次
        //初始化日志打印，每个进程都初始化一次
        PLogger.init(false);
        preInit(context);
    }

    /**
     * 预加载，在进程初始化的时候加载一次
     */
    private static void preInit(Context context) {
        PToast.init(context);                       //初始化toast提示
        RequestHelper.getInstance().init(context);  //初始化网络请求

        getCommonMgr();
        getHttpMgr();
    }

    /**
     * 将一个新模块添加的管理器中，并调用其init方法
     *
     * @param module 一个新的模块
     */
    private static void addModule(final ModuleBase module) {
        module.init();
        selfModules.add(module);
    }

    /**
     * 取得应用信息管理的实例的唯一方法，统一从此处获得，全局唯一
     *
     * @return 返回应用管理器的实例
     */
    public static HttpMgr getHttpMgr() {
        if (httpMgr == null) {
            httpMgr = new HttpMgrImpl();
            addModule(httpMgr);
        }
        return httpMgr;
    }

    /**
     * 取得应用信息管理的实例的唯一方法，统一从此处获得，全局唯一
     *
     * @return 返回应用管理器的实例
     */
    public static CommonMgr getCommonMgr() {
        if (commonMgr == null) {
            commonMgr = new CommonMgr();
            addModule(commonMgr);
        }
        return commonMgr;
    }

}
